package cuatroenraya.jugadores;

import cuatroenraya.Jugador;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;


public class JugadorAlumnoG5 extends Jugador {
    static int inicio = 1; //esta variable decine quien empezo a jugar nosotros o ellos
                            // en 1 el comienfo fue de el rival.
    public int[] jugar(int[][] tablero)
    {
        List<jugadasPosibles> jugadas=new ArrayList<jugadasPosibles>();

         int[] jugada = new int[2];
          jugada[0] = 0;
          jugada[1] = 0;

        int importanciaOfen = 2;
        int importanciaDefen = 1;
        if (inicio !=0){
        importanciaOfen = 1;
        importanciaDefen = 2;
        }
        jugadasPosibles jugadaInicial = new jugadasPosibles(0,1,1);
        jugadas.add(jugadaInicial);

        if (vacio(tablero)==true){
        jugada[0] = 3;
        jugada[1] = 3;
        }else{
        
         for (int i=0; i <8; i++){

            for (int j = 0; j<8;j++)
            {
                //Bloqueo
                if(tablero[i][j]==2){
                jugadas = this.jugadaDefensivaBase(i, j, tablero, jugadas,2, importanciaDefen );
                
                }else{
                if(tablero[i][j]==1){
                jugadas = this.jugadaOfensivaBase(i, j, tablero, jugadas, 1, importanciaOfen);
                jugadas = this.jugadaOfensivaMedio(i, j, tablero, jugadas, 1);
                jugadas = this.jugadaOfensivaGanadora(i, j, tablero, jugadas, 1);

                }

                }

               
            }
            }


        }
        

        return this.jugadaSeleccionada(jugadas);
    }

     public int [] jugadaSeleccionada( List<jugadasPosibles> jugadas){
       int[] jugada = new int[2];
        jugada[0]= 3;
        jugada[1] = 3;

        Iterator it=jugadas.iterator();
        int importancia = 0;
        while(it.hasNext())
        {
            jugadasPosibles j = (jugadasPosibles)it.next();

                if(importancia < j.importancia)
                {
                    if (j.jugada[0]<8 && j.jugada[0]>0 && j.jugada[1]<8 && j.jugada[1]>0){
                    jugada[0]= j.jugada[0];
                    jugada[1] = j.jugada[1];
                    importancia = j.importancia;
                    }
                }
        }

     return jugada;
     }
     
     
     public  List<jugadasPosibles> jugadaDefensivaBase(int i, int j, int [][] tablero, List<jugadasPosibles> jugadas,int idJugador, int peso){
      int[] jugada = new int[2];
       jugada[0] = 0;
       jugada[1] = 0;
       int importancia = peso;
        jugadasPosibles jug = new jugadasPosibles(0,0,0);
                jugadas.add(jug);
                if(this.posibleVerticalArriba(i, j, tablero,idJugador)==true&&i<6){

                if(tablero[i+2][j]!=2&&tablero[i+2][j]!=1){

                jug = new jugadasPosibles(importancia,i+2,j);
                jugadas.add(jug);

                }
                }
                 if(this.posibleVerticalAbajo(i, j, tablero,idJugador)==true&& i >1){

                if(tablero[i-2][j]!=2&&tablero[i-2][j]!=1){
                
                jug = new jugadasPosibles(importancia,i-2,j);
                jugadas.add(jug);
                }
                }

                    if(this.posibleHorizontalDer(i, j, tablero,idJugador)==true && j<6){

                if(tablero[i][j+2]!=2&&tablero[i][j+2]!=1){
             
               jug = new jugadasPosibles(importancia,i,j+2);
                jugadas.add(jug);
                }
                }
                    if(this.posibleHorizontalIzq(i, j, tablero,idJugador)==true && j > 1){

                if(tablero[i][j-2]!=2&&tablero[i][j-2]!=1){
                jug = new jugadasPosibles(importancia,i,j-2);
                   jugadas.add(jug);
                }
                }

                  if(this.posibleDiagonalAD(i, j, tablero,idJugador)==true && j < 6 && i < 6 ){

                if(tablero[i+2][j+2]!=2&&tablero[i+2][j+2]!=1){
                   jug = new jugadasPosibles(importancia,i+2,j+2);
                    jugadas.add(jug);
                }
                }

                  if(this.posibleDiagonalAI(i, j, tablero,idJugador)==true && j<6 && i > 1){

                if(tablero[i-2][j+2]!=2&&tablero[i-2][j+2]!=1){
                 jug = new jugadasPosibles(importancia,i-2,j+2);
                    jugadas.add(jug);
                }
                }

                if(this.posibleDiagonalBD(i, j, tablero,idJugador)==true && i < 6 && j > 1){

                if(tablero[i+2][j-2]!=2&&tablero[i+2][j-2]!=1){
                  jug = new jugadasPosibles(importancia,i+2,j-2);
                    jugadas.add(jug);
                }
                }

                if(this.posibleDiagonalBI(i, j, tablero,idJugador)==true && i>1 && j > 1){

                if(tablero[i-2][j-2]!=2&&tablero[i-2][j-2]!=1){
                jug = new jugadasPosibles(importancia,i-2,j-2);
                    jugadas.add(jug);
                }
                }



     return jugadas;
     }

      public  List<jugadasPosibles> jugadaOfensivaMedio(int i, int j, int [][] tablero, List<jugadasPosibles> jugadas, int idJugador){
      int[] jugada = new int[2];
      int importancia = 3;
        jugadasPosibles jug = new jugadasPosibles(0,0,0);
                jugadas.add(jug);
                if(this.posibleVerticalArriba(i, j, tablero,idJugador)==true&&i<6){

                if(i<6&&tablero[i+2][j]!=2&&tablero[i+2][j]!=1){

                jug = new jugadasPosibles(importancia,i+2,j);
                jugadas.add(jug);

                }
                }
                 if(this.posibleVerticalAbajo(i, j, tablero,idJugador)==true&&i>1){

                if(i>1&&tablero[i-2][j]!=2&&tablero[i-2][j]!=1){

                jug = new jugadasPosibles(importancia,i-2,j);
                jugadas.add(jug);
                }
                }

                    if(this.posibleHorizontalDer(i, j, tablero,idJugador)==true&&j<6){

                if(j<6&&tablero[i][j+2]!=2&&tablero[i][j+2]!=1){

               jug = new jugadasPosibles(importancia,i,j+2);
                jugadas.add(jug);
                }
                }
                    if(this.posibleHorizontalIzq(i, j, tablero,idJugador)==true&&j>1){

                if(j>1&&tablero[i][j-2]!=2&&tablero[i][j-2]!=1){
                jug = new jugadasPosibles(importancia,i,j-2);
                   jugadas.add(jug);
                }
                }

                  if(this.posibleDiagonalAD(i, j, tablero,idJugador)==true&&j<6&&i>1){

                if(i<6&&j<6&&tablero[i+2][j+2]!=2&&tablero[i+2][j+2]!=1){
                   jug = new jugadasPosibles(importancia,i+2,j+2);
                    jugadas.add(jug);
                }
                }

                  if(this.posibleDiagonalAI(i, j, tablero,idJugador)==true && j <6 && i >1){

                if(i>1&&j<6&&tablero[i-2][j+2]!=2&&tablero[i-2][j+2]!=1){
                 jug = new jugadasPosibles(importancia,i-2,j+2);
                    jugadas.add(jug);
                }
                }

                if(this.posibleDiagonalBD(i, j, tablero,idJugador)==true &&j>1 && i < 6){

                if(i<6&&j>1&&tablero[i+2][j-2]!=2&&tablero[i+2][j-2]!=1){
                  jug = new jugadasPosibles(importancia,i+2,j-2);
                    jugadas.add(jug);
                }
                }

                if(this.posibleDiagonalBI(i, j, tablero,idJugador)==true && j<6 && i < 6){

                if(i>1&&j>1&&tablero[i-2][j-2]!=2&&tablero[i-2][j-2]!=1){
                jug = new jugadasPosibles(importancia,i-2,j-2);
                    jugadas.add(jug);
                }
                }



     return jugadas;
     }

      public  List<jugadasPosibles> jugadaOfensivaGanadora(int i, int j, int [][] tablero, List<jugadasPosibles> jugadas, int idJugador){
      int[] jugada = new int[2];
      int importancia = 4;
        jugadasPosibles jug = new jugadasPosibles(0,0,0);
                jugadas.add(jug);
                if(this.posibleVerticalArriba(i, j, tablero,idJugador)==true&&this.posibleVerticalAbajo(i, j, tablero,idJugador)==true){

                if(i<6&&tablero[i+2][j]!=2&&tablero[i+2][j]!=1){

                jug = new jugadasPosibles(importancia,i+2,j);
                jugadas.add(jug);

                }

                if(i>1&&tablero[i-2][j]!=2&&tablero[i-2][j]!=1){

                jug = new jugadasPosibles(importancia,i-2,j);
                jugadas.add(jug);
                }

                }


                    if(this.posibleHorizontalDer(i, j, tablero,idJugador)==true&&this.posibleHorizontalIzq(i, j, tablero,idJugador)==true){

                if(j<6&&tablero[i][j+2]!=2&&tablero[i][j+2]!=1){

               jug = new jugadasPosibles(importancia,i,j+2);
                jugadas.add(jug);
                }

                if(j>1&&tablero[i][j-2]!=2&&tablero[i][j-2]!=1){
                jug = new jugadasPosibles(importancia,i,j-2);
                   jugadas.add(jug);
                }
                }

                  if(this.posibleDiagonalAD(i, j, tablero,idJugador)==true&&this.posibleDiagonalBI(i, j, tablero,idJugador)==true){

                if(i<6 && j <6 && tablero[i+2][j+2]!=2&&tablero[i+2][j+2]!=1){
                   jug = new jugadasPosibles(importancia,i+2,j+2);
                    jugadas.add(jug);
                }

                if(j>1 && i >1 && tablero[i-2][j-2]!=2&&tablero[i-2][j-2]!=1){
                jug = new jugadasPosibles(importancia,i-2,j-2);
                    jugadas.add(jug);
                }
                }



                if(this.posibleDiagonalAI(i, j, tablero,idJugador)==true&&this.posibleDiagonalBD(i, j, tablero,idJugador)==true){

                if(i>1&& j <6 && tablero[i-2][j+2]!=2&&tablero[i-2][j+2]!=1){
                 jug = new jugadasPosibles(importancia,i-2,j+2);
                    jugadas.add(jug);
                }


                if(i<6 && j>1 && tablero[i+2][j-2]!=2&&tablero[i+2][j-2]!=1){
                  jug = new jugadasPosibles(importancia,i+2,j-2);
                    jugadas.add(jug);
                }
                }

     return jugadas;
     }


       public  List<jugadasPosibles> jugadaOfensivaBase(int i, int j, int [][] tablero, List<jugadasPosibles> jugadas, int idJugador, int peso){
          int[] jugada = new int[2];
          int importancia = peso;
        jugadasPosibles jug = new jugadasPosibles(0,0,0);
                jugadas.add(jug);

                 if(i<8 && i>=0 && j<8 && j>=0){
                if(i<7&&tablero[i+1][j]!=2&&tablero[i+1][j]!=1){

                jug = new jugadasPosibles(importancia,i+1,j);
                jugadas.add(jug);
                }


                if(i>0&&tablero[i-1][j]!=2&&tablero[i-1][j]!=1){

                jug = new jugadasPosibles(importancia,i-1,j);
                jugadas.add(jug);
                }


                if(j<7&&tablero[i][j+1]!=2&&tablero[i][j+1]!=1){

               jug = new jugadasPosibles(importancia,i,j+1);
                jugadas.add(jug);
                }

                if(j>0 && tablero[i][j-1]!=2&&tablero[i][j-1]!=1){
                jug = new jugadasPosibles(importancia,i,j-1);
                   jugadas.add(jug);
                }


                if(i<7&& j <7 &&tablero[i+1][j+1]!=2&&tablero[i+1][j+1]!=1){
                   jug = new jugadasPosibles(importancia,i+1,j+1);
                    jugadas.add(jug);
                }

                if(j>0&& i>0 && tablero[i-1][j-1]!=2&&tablero[i-1][j-1]!=1){
                jug = new jugadasPosibles(importancia,i-1,j-1);
                    jugadas.add(jug);
                }


                if(i>0 && j<7 &&tablero[i-1][j+1]!=2&&tablero[i-1][j+1]!=1){
                 jug = new jugadasPosibles(importancia,i-1,j+1);
                    jugadas.add(jug);
                }


                if(j>1 && i<6 && tablero[i+1][j-1]!=2&&tablero[i+1][j-1]!=1){
                  jug = new jugadasPosibles(importancia,i+2,j-2);
                    jugadas.add(jug);
                }
              }

     return jugadas;
     }


     public boolean vacio(int [][] tablero){
     boolean vacio = false;
     for (int i=0; i <8; i++){

            for (int j = 0; j<8;j++)
            {
            if(tablero[i][j]==1||tablero[i][j]==2){
            vacio = false;
         
            return vacio;
            }else{
            vacio = true;
          // inicio = 0;
            }
            }
        }
     return vacio;
     }

     public boolean posibleVerticalArriba(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
if(i<7 && i>=0 && j<8 && j>=0){
 if(tablero [i+1][j]==idJugador){
 posible = true;
 }}
 return posible;
 }
  public boolean posibleVerticalAbajo(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<8 && i>0 && j<8 && j>=0){
 if(tablero [i-1][j]==idJugador){
 posible = true;
 }}
 return posible;
 }

 public boolean posibleHorizontalDer(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<8 && i>=0 && j<7 && j>=0){
 if(tablero [i][j+1]==idJugador){
 posible = true;
 }}
 return posible;
 }

  public boolean posibleHorizontalIzq(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<8 && i>=0 && j<8 && j>0){
 if(tablero [i][j-1]==idJugador){
 posible = true;
 }}
 return posible;
 }

 public boolean posibleDiagonalAD(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<7 && i>=0 && j<7 && j>=0){
 if(tablero [i+1][j+1]==idJugador){
 posible = true;
 }}
 return posible;
 }

 public boolean posibleDiagonalAI(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<8 && i>0 && j<7 && j>=0){
 if(tablero [i-1][j+1]==idJugador){
 posible = true;
 }}
 return posible;
 }
public boolean posibleDiagonalBD(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<7 && i>=0 && j<8 && j>0){
 if(tablero [i+1][j-1]==idJugador){
 posible = true;
 }}
 return posible;
 }

public boolean posibleDiagonalBI(int i, int j, int [][] tablero,int idJugador){
 boolean posible = false;
 if(i<8 && i>0 && j<8 && j>0){
 if(tablero [i-1][j-1]==idJugador){
 posible = true;
 }}
 return posible;
 }


protected class jugadasPosibles{
 private int importancia = 0;
        private int[] jugada = new int[2];

        public int getImportancia() {
            return importancia;
        }

        public void setImportancia(int importancia) {
            this.importancia = importancia;
        }

        public int[] getJugada() {
            return jugada;
        }
        public void setJugada(int[] jugada) {
            this.jugada = jugada;
        }

       jugadasPosibles(int importancia, int i, int j){

this.importancia = importancia;
this.jugada[0] = i;
this.jugada[1] = j;
}

}


}
